/*
 * editorRevoluciones.h
 *
 *  Created on: 07/01/2011
 *      Author: julian
 */

#ifndef EDITORREVOLUCIONES_H_
#define EDITORREVOLUCIONES_H_

#include "coord.h"
#include "mapa.h"
#include <list>
#include "bscerrada.h"
using namespace std;

class editorRevoluciones {
private:
	list<Coord>* coordenadas;
	Mapa* terreno;
public:
	editorRevoluciones(Mapa* terreno){
		this->coordenadas = new list<Coord>;
		this->terreno = terreno;
	}

	void cerrarCurva(){
		if((coordenadas->size()>=3)&&(Bspline::satisfacePrecond(coordenadas->size()))){
			Coord* puntosControlBspline = new Coord[coordenadas->size()];
			list<Coord>::iterator it;
			int i = 0;
			for ( it=coordenadas->begin() ; it != coordenadas->end(); it++ ){
				puntosControlBspline[i]=*it;
				i++;
			}

			BsplineCerrada* revolucion = new BsplineCerrada(coordenadas->size(), puntosControlBspline);
			this->terreno->agregarRevolucion(revolucion);
			coordenadas->erase(coordenadas->begin(),coordenadas->end());
                        delete[] puntosControlBspline;
		}
	}

	/*
	 * Debe recibir coordenadas normalizadas en el intervalo [0;1]x[0;1]x[0;1].
	 * Se descartará el valor de z.
	 */
	void agregarCoordenada(Coord punto){
		Coord nuevoPunto;
		//Desplazamiento por mapa centrado
		float desplX = punto.x();
		float desplY = punto.y()-0.5;
		float nuevoX = desplX * terreno->ancho();
		float nuevoY = desplY * terreno->alto();
		nuevoPunto.set(nuevoX, nuevoY, 0.0f);
		this->coordenadas->push_back(nuevoPunto);
	}

	void dibujarPuntosControl(){
		list<Coord>::iterator it;
		glPointSize(5);
		glBegin(GL_POINTS);
			glColor3f(1.0,0.0,0.0);
			for ( it=coordenadas->begin() ; it != coordenadas->end(); it++ ){
				float coordX = (*it).x()/this->terreno->ancho();
				float coordY = (*it).y()/this->terreno->alto();
				glVertex2f(coordX,coordY);
			}
		glEnd();
	}

	virtual ~editorRevoluciones(){
		delete coordenadas;
		delete terreno;
	}
};

#endif /* EDITORREVOLUCIONES_H_ */
